package com.atguigu.gmall.product.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.cache.GmallCache;
import com.atguigu.gmall.product.mapper.BaseCategoryViewMapper;
import com.atguigu.gmall.product.model.BaseCategoryView;
import com.atguigu.gmall.product.service.BaseCategoryViewService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

;

/**
 * VIEW 业务实现类
 *
 * @author lan
 * @since 2023-04-21
 */
@Service
public class BaseCategoryViewServiceImpl extends ServiceImpl<BaseCategoryViewMapper, BaseCategoryView> implements BaseCategoryViewService {

    /**
     * 查询所有分类列表 分类嵌套结果: 一级分类对象中包含二级分类集合;在二级分类对象中包含三级分类集合
     *
     * @return
     */
    @Override
    @GmallCache(prefix = "baseCategoryList")
    public List<JSONObject> getBaseCategoryList() {
        //1.构建所有一级分类集合对象
        List<JSONObject> list = new ArrayList<>();
        //2.查询分类视图获取所有的分类集合
        List<BaseCategoryView> allCategoryList = this.list();
        //对集合惊醒分组,通过一级分类id
         Map<Long, List<BaseCategoryView>> category1ListMap = allCategoryList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
         int index=1;
         //遍历分组后,,处理一级分类数据
        for (Map.Entry<Long, List<BaseCategoryView>> category1Entry : category1ListMap.entrySet()) {
            JSONObject category1=new JSONObject();
            //获得一级分类id
            Long category1Id = category1Entry.getKey();
            //获取一级分类名字
            String category1Name = category1Entry.getValue().get(0).getCategory1Name();
            category1.put("index",index++);
            category1.put("categoryId",category1Id);
            category1.put("categoryName",category1Name);
            //处理当前一级分类中的二级分类
            Map<Long, List<BaseCategoryView>> category2ListMap =
                    category1Entry.getValue().stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
            //遍历二级分类Map 获取二级分类ID以及名称
            List<JSONObject> category2JsonList = new ArrayList<>();
            for (Map.Entry<Long, List<BaseCategoryView>> category2Entry : category2ListMap.entrySet()) {
                //构建二级分类JSon对象
                JSONObject category2=new JSONObject();
                //获取二级分类的id和名字
                Long category2Id = category2Entry.getKey();
                String category2Name = category2Entry.getValue().get(0).getCategory2Name();
                //封装到二级分类的json对象中
                category2.put("categoryId",category2Id);
                category2.put("categoryName",category2Name);
                //每次遍历都把2的json对象,存入2的json集合中
                category2JsonList.add(category2);
                //处理当前二级分类中包含三级分类,,三级分类不用在分组了
                //封装三级分类,直接从耳机分组后val中获取即可
                //创建一个3的json集合
                List<JSONObject> category3JsonList = new ArrayList<>();
                List<BaseCategoryView> category3List = category2Entry.getValue();
                //遍历三级分类集合 构建三级分类对象;将三级分类集合
                // 放入二级分类对象 categoryChild属性中
                for (BaseCategoryView baseCategoryView : category3List) {
                    JSONObject category3 = new JSONObject();
                    category3.put("categoryId",baseCategoryView.getCategory3Id());
                    category3.put("categoryName",baseCategoryView.getCategory3Name());
                    category3JsonList.add(category3);
                }
                //将处理后三级分类加入当前二级分类中
                category2.put("categoryChild",category3JsonList);

            }
            //将处理后二级分类加入当前一级分类中
            category1.put("categoryChild",category2JsonList);
            list.add(category1);

        }

        return list;
    }
}
